package editorsvg.editor.herramientas;

import editorsvg.editor.cursores.Cursores;
import editorsvg.editor.documento.Direccion;
import editorsvg.editor.herramientas.controles.Asa;
import editorsvg.editor.formas.Trayecto;
import editorsvg.editor.herramientas.controles.PuntoControl;
import editorsvg.editor.vista.EditorDocumento;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;

/**
 * 
 * @author Jorge Berjano
 */
public class HerramientaTrayecto extends HerramientaBase {

    private EditorDocumento editor;
    private AyudanteCreacionTrayecto ayudante;
    private Point2D posicionInicial;
    
//    private Point2D posicionAnterior;
    private Point2D posicionActual;
    
//    private Point2D posicionControl;
    private Asa asaInicial;
    private PuntoControl puntoControlActual;

    public HerramientaTrayecto(EditorDocumento editor) {
        this.editor = editor;
    }

    @Override
    public boolean dobleClick(MouseEvent e) {
        finalizar();
        return true;
    }

    private void inicializar(Point punto) {
        Point2D posicion = editor.getConversor().aUnidadesReales(punto);
        asaInicial = new Asa(Direccion.CENTRO, punto);
        ayudante = new AyudanteCreacionTrayecto();
        posicionInicial = posicion;
        ayudante.iniciar(posicionInicial);
        seguir(punto); 
    }
    
    private void seguir(Point punto) {
        Point2D posicion = editor.getConversor().aUnidadesReales(punto);
        posicionActual = posicion;
        ayudante.agregarNodo(posicionActual);
    }

    private void finalizar() {
        ayudante.cerrar();
        editor.finalizarCreacionForma(ayudante.getTrayecto());
        ayudante = null;
        asaInicial = null;
        posicionInicial = null;
        posicionActual = null;
    }

    @Override
    public boolean pulsado(MouseEvent e) {

        if (ayudante == null) {
            inicializar(e.getPoint());

        } else if (asaInicial.contiene(e.getPoint())) {
            ayudante.agregarNodo(posicionInicial);
            finalizar();
        } else {
            seguir(e.getPoint());
        }
        puntoControlActual = null;
        return true;
    }

    @Override
    public boolean arrastrando(MouseEvent e) {
        if (ayudante == null) {
            return false;
        }
        
        Point2D posicion = editor.getConversor().aUnidadesReales(e.getPoint());
        if (puntoControlActual == null) {
            puntoControlActual = new PuntoControl(e.getPoint());
        }
        puntoControlActual.setPuntoExtremo(e.getPoint());
        
        ayudante.siguientePosicionControl1(posicion);
        ayudante.actualPosicionControl2Simetrica();
        return true;
    }

    @Override
    public boolean moviendo(MouseEvent e) {
        if (ayudante == null) {
            return false;
        }

        Point2D posicion = editor.getConversor().aUnidadesReales(e.getPoint());
        ayudante.siguientePosicion(posicion);
        boolean ratonSobreAsa = asaInicial.contiene(e.getPoint());
        asaInicial.setColorRelleno(ratonSobreAsa ? Color.RED : null);
        return true;
    }

    @Override
    public boolean liberado(MouseEvent e) {
        if (puntoControlActual != null) {
            Point2D posicionControl1 = editor.getConversor().aUnidadesReales(e.getPoint());
            //double posicionControl2 = 
            ayudante.siguientePosicionControl1(posicionControl1);
        }


        return false;
    }

    public Cursor getCursor() {        
        return Cursores.TRAYECTO.getCursor();
    }

    @Override
    public void pintarEnPixeles(Graphics2D graphics) {
        graphics.setColor(Color.BLACK);
        graphics.setXORMode(Color.WHITE);
        graphics.setStroke(new BasicStroke(1));

        if (asaInicial != null) {
            asaInicial.pintar(graphics);
        }

        if (puntoControlActual != null) {
            puntoControlActual.pintar(graphics);
            puntoControlActual.opuesto().pintar(graphics);
        }

        if (ayudante != null) {
            Shape shapePixels = editor.getConversor().transformarAPixeles(ayudante.getTrayecto().getShape());
            graphics.draw(shapePixels);
        }

        graphics.setPaintMode();
    }
}
